package org.example.t0526;

/**
 * 自旋锁
 */
public class T2 {
   //-Xms4m -Xmx4m  -XX:+PrintGCDetails -XX:+UseG1GC
    enum ReadTorun{T1,T2};

    /**
     * volatile让变量每次在使用的时候，都从主存中取。而不是从各个线程的“工作内存”。
     *
     * volatile具有synchronized关键字的“可见性”，但是没有synchronized关键字的“并发正确性”，也就是说不保证线程执行的有序性。
     *
     * 也就是说，volatile变量对于每次使用，线程都能得到当前volatile变量的最新值。但是volatile变量并不保证并发的正确性
     */
    static volatile ReadTorun r = ReadTorun.T1;
    public static void main(String[] args) {
        char [] a1 = "1234567".toCharArray();
        char [] a2 = "ABCDEFG".toCharArray();

        new Thread(() ->{
           for(char a : a1){
               while(r != ReadTorun.T1){}
               System.out.print(a);
               r = ReadTorun.T2;
           }
        },"t1").start();
        new Thread(() ->{
            for(char a : a2){
                while(r != ReadTorun.T2){}
                System.out.print(a);
                r = ReadTorun.T1;
            }
        },"t2").start();

    }
}
